package com.shiyun.disaster_station.utils;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import cn.hutool.poi.excel.sax.handler.RowHandler;
import lombok.SneakyThrows;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
import java.util.stream.Collectors;

/**
 * 类 描 述: Excel操作工具类型
 * 作   者: 史 云
 * @author 史 云
 * 版   本: 1.0.0
 * 时   间: 2021年12月07日  11:16:00
 */
@Component
public class ExcelUtils {
    /**
     * 方法描述: 获取临时File
     * 作   者: 史 云
     * 时   间: 2021年12月08日 15:56:00
     */
    private File getFile(List<String> headerTextList,List<String> headerKeyList,JSONArray list,String title){
        // hutool支持的List
        List<Map<String,Object>> huList = new ArrayList<>(16);
        // 获取hutool的List
        for(int index=0;index<list.size();index++){
            JSONObject it = list.getJSONObject(index);
            Map<String,Object> ele = new HashMap<>(3);
            for(int i=0;i<headerKeyList.size();i++){
                String key = headerKeyList.get(i);
                String text = headerTextList.get(i);
                ele.put(text,it.getStr(key));
            }
            huList.add(ele);
        }
        // 获取EXCEL
        File file = new File("/excel/"+ UUID.randomUUID()+"/" + title + ".xlsx");
        ExcelWriter writer = ExcelUtil.getWriter(file);
        writer.write(huList);
        writer.flush();
        writer.close();
        return file;
    }

    /**
     * 方法描述: 获取导入的对象
     * 作   者: 史 云
     * 时   间: 2022年02月25日 11:27:00
     */
    public static <T> List<T> importExcel(MultipartFile file, List<String> headerTextList, List<String> headerKeyList, Class<T> clzz) throws IOException {
        ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
        int size = headerTextList.size();
        for (int i=0;i<size;i++){
            reader.addHeaderAlias(headerTextList.get(i),headerKeyList.get(i));
        }
        return reader.readAll(clzz);
    }

    /**
     * 方法描述: 获取导入的对象
     * 作    者: 史 云
     * 时    间: 2022年04月12日  17:22:14
     */
    @SneakyThrows
    public static <T> List<T> importExcel(MultipartFile file, List<String> headerTextList, List<String> headerKeyList, Class<T> clzz,String sheetName){
        ExcelReader reader;
        // 判断表名称是否存在
        if(StrUtil.isNotBlank(sheetName)){
            reader = ExcelUtil.getReader(file.getInputStream(),sheetName);
        }else {
            reader = ExcelUtil.getReader(file.getInputStream());
        }
        int size = headerTextList.size();
        for (int i=0;i<size;i++){
            reader.addHeaderAlias(headerTextList.get(i),headerKeyList.get(i));
        }
        return reader.readAll(clzz);
    }

    /**
     * 方法描述: 获取导入的对象
     * 作   者: 史 云
     * 时   间: 2022年02月25日 11:36:00
     */
    public static <T> List<T> importExcel(InputStream inputStream, List<String> headerTextList, List<String> headerKeyList, Class<T> clzz){
        ExcelReader reader = ExcelUtil.getReader(inputStream);
        int size = headerTextList.size();
        for (int i=0;i<size;i++){
            reader.addHeaderAlias(headerTextList.get(i),headerKeyList.get(i));
        }
        return reader.readAll(clzz);
    }

    /**
     * 方法描述: Excel多sheet导入
     * 作   者: 谭志伟
     * 时   间: 2022/5/13 16:34
     */
    public static <T> List<T> importExcel(InputStream inputStream, List<String> tableList, Class<T> clzz) {
        JSONArray array = new JSONArray();
        ExcelUtil.readBySax(inputStream, -1, new RowHandler() {
            @Override
            public void handle(int sheetIndex, long rowIndex, List<Object> rowList) {
                List<Object> collect = rowList.stream().filter(item -> item != null && item != "").collect(Collectors.toList());
                if (rowIndex != 0 && CollectionUtil.isNotEmpty(collect)) { // 不读取每个sheet的第一行
                    JSONObject jsonObject = new JSONObject();
                    for (int i = 0; i < tableList.size(); i++) {
                        if ("attrJson".equals(String.valueOf(tableList.get(i)))) { // 特殊处理attrJson
                            String valueOf = String.valueOf(rowList.get(i));
                            jsonObject.putOpt(String.valueOf(tableList.get(i)), valueOf);
                        } else {
                            jsonObject.putOpt(String.valueOf(tableList.get(i)), rowList.get(i));
                        }
                    }
                    array.add(jsonObject);
                }
            }
        });
        return JSONUtil.toList(array, clzz);
    }

    /**
     * 方法描述: 获取导入的对象
     * 作    者: 史 云
     * 时    间: 2022年04月12日  17:23:02
     */
    public static <T> List<T> importExcel(InputStream inputStream, List<String> headerTextList, List<String> headerKeyList, Class<T> clzz,String sheetName){
        ExcelReader reader;
        if(StrUtil.isNotBlank(sheetName)){
            reader = ExcelUtil.getReader(inputStream,sheetName);
        }else {
            reader = ExcelUtil.getReader(inputStream);
        }
        int size = headerTextList.size();
        for (int i=0;i<size;i++){
            reader.addHeaderAlias(headerTextList.get(i),headerKeyList.get(i));
        }
        return reader.readAll(clzz);
    }

}
